package com.qf.commons.core.utils;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * SpringSecurity + Oauth2
 * Jwt令牌生成/解析工具类
 */
public class JwtUtils {

    //密钥由调用方来决定
    private static String secretKey = "3092ffb5-b599-49d9-bbea-184136ae0669";
    //有效期也由调用方来决定
    private static long ttl = 1000 * 60 * 60 * 2;
//    private static long ttl = 1000 * 10;

    /**
     * 生成jwt令牌的方法
     * @return
     */
    public static String createJwtToken(String key, Object value){
        //设置自定义的map集合 存放自定义的数据
        Map<String, Object> params = new HashMap<>();
        params.put(key, value);
        long now = System.currentTimeMillis();
        JwtBuilder jwtBuilder = Jwts.builder()
                //设置令牌的生成时间
                .setIssuedAt(new Date(now))
                //添加额外的数据
                .addClaims(params)
                //设置JWT生成的加密算法以及密钥
                .signWith(SignatureAlgorithm.HS256, secretKey);
        if(ttl > 0){
            //设置令牌的过期时间
            jwtBuilder.setExpiration(new Date(now + ttl));
        }
        //生成令牌
        return jwtBuilder.compact();
    }

    /**
     * 解析令牌
     * @param jwtToken
     * @return
     */
    public static <T> T parseJwtToken(String jwtToken, String key){
        try {
            Claims claims = Jwts.parser().setSigningKey(secretKey)
                    .parseClaimsJws(jwtToken).getBody();
            return (T) claims.get(key);
        } catch (Throwable t) {
            return null;
        }
    }
}